package EventLoopTest.EventLoopTutorial;

import io.netty.channel.EventLoop;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.ScheduledFuture;

import java.util.concurrent.TimeUnit;

/**
 * EventLoop 入门示例3：定时任务
 * 学习目标：理解EventLoop的定时任务功能
 */
public class Demo03_ScheduledTask {
    public static void main(String[] args) throws InterruptedException {
        EventLoopGroup group = new NioEventLoopGroup(1);
        EventLoop eventLoop = group.next();
        
        System.out.println("当前时间: " + System.currentTimeMillis());
        
        // 1. 延迟执行（只执行一次）
        System.out.println("\n=== 提交延迟任务 ===");
        ScheduledFuture<?> future1 = eventLoop.schedule(() -> {
            System.out.println("延迟2秒执行 - 时间: " + System.currentTimeMillis());
        }, 2, TimeUnit.SECONDS);
        
        // 2. 固定频率执行（周期性）
        System.out.println("=== 提交周期任务 ===");
        ScheduledFuture<?> future2 = eventLoop.scheduleAtFixedRate(() -> {
            System.out.println("每隔1秒执行一次 - 时间: " + System.currentTimeMillis());
        }, 1, 1, TimeUnit.SECONDS);
        // 参数说明：初始延迟1秒，之后每隔1秒执行一次
        
        // 3. 固定延迟执行
        ScheduledFuture<?> future3 = eventLoop.scheduleWithFixedDelay(() -> {
            System.out.println("任务完成后延迟1秒再执行 - 时间: " + System.currentTimeMillis());
            try {
                Thread.sleep(500); // 模拟任务耗时
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, 1, 1, TimeUnit.SECONDS);
        // 参数说明：初始延迟1秒，每次任务完成后延迟1秒再执行下一次
        
        // 让程序运行5秒观察效果
        Thread.sleep(5000);
        
        // 取消定时任务
        future2.cancel(false);
        future3.cancel(false);
        
        System.out.println("\n=== 定时任务已取消 ===");
        
        // 关键区别：
        // scheduleAtFixedRate: 固定频率（忽略任务执行时间）
        // scheduleWithFixedDelay: 固定延迟（任务完成后才计算延迟）
        
        group.shutdownGracefully();
    }
}

